/*
 * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */

package java.awt.event;

import java.awt.Adjustable;
import java.awt.AWTEvent;
import java.lang.annotation.Native;


/**
 * The adjustment event emitted by Adjustable objects like
 * {@link java.awt.Scrollbar} and {@link java.awt.ScrollPane}.
 * When the user changes the value of the scrolling component,
 * it receives an instance of {@code AdjustmentEvent}.
 * <p>
 * An unspecified behavior will be caused if the {@code id} parameter
 * of any particular {@code AdjustmentEvent} instance is not
 * in the range from {@code ADJUSTMENT_FIRST} to {@code ADJUSTMENT_LAST}.
 * <p>
 * The {@code type} of any {@code AdjustmentEvent} instance takes one of the following
 * values:
 * <ul>
 * <li> {@code UNIT_INCREMENT}
 * <li> {@code UNIT_DECREMENT}
 * <li> {@code BLOCK_INCREMENT}
 * <li> {@code BLOCK_DECREMENT}
 * <li> {@code TRACK}
 * </ul>
 * Assigning the value different from listed above will cause an unspecified behavior.
 *
 * @author Amy Fowler
 * @see java.awt.Adjustable
 * @see AdjustmentListener
 * @since 1.1
 */
public class AdjustmentEvent extends AWTEvent {

  /**
   * Marks the first integer id for the range of adjustment event ids.
   */
  public static final int ADJUSTMENT_FIRST = 601;

  /**
   * Marks the last integer id for the range of adjustment event ids.
   */
  public static final int ADJUSTMENT_LAST = 601;

  /**
   * The adjustment value changed event.
   */
  public static final int ADJUSTMENT_VALUE_CHANGED = ADJUSTMENT_FIRST; //Event.SCROLL_LINE_UP

  /**
   * The unit increment adjustment type.
   */
  @Native
  public static final int UNIT_INCREMENT = 1;

  /**
   * The unit decrement adjustment type.
   */
  @Native
  public static final int UNIT_DECREMENT = 2;

  /**
   * The block decrement adjustment type.
   */
  @Native
  public static final int BLOCK_DECREMENT = 3;

  /**
   * The block increment adjustment type.
   */
  @Native
  public static final int BLOCK_INCREMENT = 4;

  /**
   * The absolute tracking adjustment type.
   */
  @Native
  public static final int TRACK = 5;

  /**
   * The adjustable object that fired the event.
   *
   * @serial
   * @see #getAdjustable
   */
  Adjustable adjustable;

  /**
   * <code>value</code> will contain the new value of the
   * adjustable object.  This value will always be  in a
   * range associated adjustable object.
   *
   * @serial
   * @see #getValue
   */
  int value;

  /**
   * The <code>adjustmentType</code> describes how the adjustable
   * object value has changed.
   * This value can be increased/decreased by a block or unit amount
   * where the block is associated with page increments/decrements,
   * and a unit is associated with line increments/decrements.
   *
   * @serial
   * @see #getAdjustmentType
   */
  int adjustmentType;


  /**
   * The <code>isAdjusting</code> is true if the event is one
   * of the series of multiple adjustment events.
   *
   * @serial
   * @see #getValueIsAdjusting
   * @since 1.4
   */
  boolean isAdjusting;


  /*
   * JDK 1.1 serialVersionUID
   */
  private static final long serialVersionUID = 5700290645205279921L;


  /**
   * Constructs an <code>AdjustmentEvent</code> object with the
   * specified <code>Adjustable</code> source, event type,
   * adjustment type, and value.
   * <p> This method throws an
   * <code>IllegalArgumentException</code> if <code>source</code>
   * is <code>null</code>.
   *
   * @param source The <code>Adjustable</code> object where the event originated
   * @param id An integer indicating the type of event. For information on allowable values, see the
   * class description for {@link AdjustmentEvent}
   * @param type An integer indicating the adjustment type. For information on allowable values, see
   * the class description for {@link AdjustmentEvent}
   * @param value The current value of the adjustment
   * @throws IllegalArgumentException if <code>source</code> is null
   * @see #getSource()
   * @see #getID()
   * @see #getAdjustmentType()
   * @see #getValue()
   */
  public AdjustmentEvent(Adjustable source, int id, int type, int value) {
    this(source, id, type, value, false);
  }

  /**
   * Constructs an <code>AdjustmentEvent</code> object with the
   * specified Adjustable source, event type, adjustment type, and value.
   * <p> This method throws an
   * <code>IllegalArgumentException</code> if <code>source</code>
   * is <code>null</code>.
   *
   * @param source The <code>Adjustable</code> object where the event originated
   * @param id An integer indicating the type of event. For information on allowable values, see the
   * class description for {@link AdjustmentEvent}
   * @param type An integer indicating the adjustment type. For information on allowable values, see
   * the class description for {@link AdjustmentEvent}
   * @param value The current value of the adjustment
   * @param isAdjusting A boolean that equals <code>true</code> if the event is one of a series of
   * multiple adjusting events, otherwise <code>false</code>
   * @throws IllegalArgumentException if <code>source</code> is null
   * @see #getSource()
   * @see #getID()
   * @see #getAdjustmentType()
   * @see #getValue()
   * @see #getValueIsAdjusting()
   * @since 1.4
   */
  public AdjustmentEvent(Adjustable source, int id, int type, int value, boolean isAdjusting) {
    super(source, id);
    adjustable = source;
    this.adjustmentType = type;
    this.value = value;
    this.isAdjusting = isAdjusting;
  }

  /**
   * Returns the <code>Adjustable</code> object where this event originated.
   *
   * @return the <code>Adjustable</code> object where this event originated
   */
  public Adjustable getAdjustable() {
    return adjustable;
  }

  /**
   * Returns the current value in the adjustment event.
   *
   * @return the current value in the adjustment event
   */
  public int getValue() {
    return value;
  }

  /**
   * Returns the type of adjustment which caused the value changed
   * event.  It will have one of the following values:
   * <ul>
   * <li>{@link #UNIT_INCREMENT}
   * <li>{@link #UNIT_DECREMENT}
   * <li>{@link #BLOCK_INCREMENT}
   * <li>{@link #BLOCK_DECREMENT}
   * <li>{@link #TRACK}
   * </ul>
   *
   * @return one of the adjustment values listed above
   */
  public int getAdjustmentType() {
    return adjustmentType;
  }

  /**
   * Returns <code>true</code> if this is one of multiple
   * adjustment events.
   *
   * @return <code>true</code> if this is one of multiple adjustment events, otherwise returns
   * <code>false</code>
   * @since 1.4
   */
  public boolean getValueIsAdjusting() {
    return isAdjusting;
  }

  public String paramString() {
    String typeStr;
    switch (id) {
      case ADJUSTMENT_VALUE_CHANGED:
        typeStr = "ADJUSTMENT_VALUE_CHANGED";
        break;
      default:
        typeStr = "unknown type";
    }
    String adjTypeStr;
    switch (adjustmentType) {
      case UNIT_INCREMENT:
        adjTypeStr = "UNIT_INCREMENT";
        break;
      case UNIT_DECREMENT:
        adjTypeStr = "UNIT_DECREMENT";
        break;
      case BLOCK_INCREMENT:
        adjTypeStr = "BLOCK_INCREMENT";
        break;
      case BLOCK_DECREMENT:
        adjTypeStr = "BLOCK_DECREMENT";
        break;
      case TRACK:
        adjTypeStr = "TRACK";
        break;
      default:
        adjTypeStr = "unknown type";
    }
    return typeStr
        + ",adjType=" + adjTypeStr
        + ",value=" + value
        + ",isAdjusting=" + isAdjusting;
  }
}
